package pers.ree.demo.basic;

/**
 * 验证初始化顺序
 * 1.在进入static块之前
 * （1）static常量和变量就已经被加载并赋予默认值了
 * （2）static常量如果是在定义时就赋值的，此时赋值操作已经执行了
 * （3）static变量如果是在定义时赋值的，则看赋值语句在代码中的位置，
 *      如果在static块之前，则已经执行；
 *      如果在static块之后，则未执行
 * 2.static块中不能识别和访问定义在之后的static常量和变量
 * 3.构造方法的执行：在static常量的定义及赋值，static块的执行都在构造方法之前，
 *      static变量的加载及默认值赋值在构造方法之前，但是赋值语句可以在构造方法中或其他成员方法；
 * 4.static常量的赋值只能在定义语句或static块
 */
public class InitSequenceDemo {

    public InitSequenceDemo() {
        System.out.println("this is constructor");
//        sfl = 333L;
//        sl = 3;
        System.out.println("sl="+sl);
    }

    private void test() {
        sl = 3L;
        System.out.println("sl="+sl);
    }

    private static void init() {
        System.out.println("init begin");
        // static常量的赋值只能在定义语句或static块
//        sfl = 333L;
    }


//    private static final long sfl;
    private static long sl;


    private static final int sfi;
    private static int si;

    static {
        si = 1;
        sfi = 111;
        System.out.println("static1");

//        System.out.println(afterSi);
//        System.out.println(afterSfi);
    }

    private static final int afterSfi = 222;
    private static int afterSi = 2;

    private static final String ssf1 = "ssf1";
    private static String ss = "ss";
    private static final String ssf2 = "ssf2";

    static {
        System.out.println(ssf1);
        System.out.println(ss);
        System.out.println(ssf2);
        System.out.println("this is static block");
        System.out.println(afterSi);
        System.out.println(afterSfi);
//        System.out.println(afterSsf1);
//        System.out.println(afterSs);
//        System.out.println(afterSsf2);

    }

    private static final String afterSsf1 = "afterSsf1";
    private static String afterSs = "afterSs";
    private static final String afterSsf2 = "afterSsf2";


    public static void main(String[] args) {
        System.out.println(afterSsf1);
        System.out.println(afterSs);
        System.out.println(afterSsf2);

        // static常量的赋值只能在定义语句或static块
//        sfl = 333L;

        InitSequenceDemo initSequenceDemo = new InitSequenceDemo();
        initSequenceDemo.test();
    }
}
